﻿//using System;
//using System.Collections.Generic;
//using System.Text;
//using DCRF.Common.Core;
//using DCRF.Common.Primitive;
//using DCRF.Common.Helper;
//using System.Reflection;
//using DCRF.Common.DBC;
//using DCRF.Common.Interface;
//using DCRF.Common.Definition;

//namespace DCRF.BaseBlocks
//{
//    public class ContractChecker : BlockBase
//    {
//        public override BlockInfo BlockInfo
//        {
//            get
//            {
//                BlockInfo result = new BlockInfo();
//                result.BlockID = new CID("ContractChecker", new BlockVersion(1, 0, 0, 0), "DCRF");
//                return result;
//            }
//        }

//        public override BlockType Type
//        {
//            get
//            {
//                return BlockType.SingleInstance;
//            }
//        }

//        public override void StartupConstructor(List<object> args)
//        {
//            //TODO: fix BlockWeb.PreBlockCall += new PreBlockCallEventDelegate(BlockWeb_PreBlockCall);
//        }

//        void BlockWeb_PreBlockCall(IBlockWeb sender, Guid guid, string serviceName, object[] args, 
//            ref object response, ref bool cancelCall)
//        {
//            throw new NotImplementedException();

//            //MethodInfo mi = null;

//            //if (subject is BlockBase)
//            //{
//            //    mi = BlockHelper.FindServiceMethod(subject, guid, serviceName, args);
//            //}
//            //else
//            //{
//            //    mi = subject.GetType().GetMethod("ProcessRequest");
//            //}

//            //checkNotNullAttributes(args, mi);

//            //checkLessThanAttributes(args, mi);
//        }

//        private void checkLessThanAttributes(object[] args, MethodInfo mi)
//        {
//            object[] attrs = mi.GetCustomAttributes(typeof(CheckLessThanAttribute), true);
//            ParameterInfo[] pis = mi.GetParameters();

//            if (attrs != null && attrs.Length > 0)
//            {
//                foreach (CheckLessThanAttribute attr in attrs)
//                {
//                    int index = FindParameter(pis, attr.ParameterName);
//                    int value = (int)args[index];

//                    if ( value >= attr.Target)
//                    {
//                        throw new Exception("DBC Check Failed: LessThan(" + attr.ParameterName + ","+attr.Target.ToString()+")");
//                    }
//                }
//            }
//        }

//        private void checkNotNullAttributes(object[] args, MethodInfo mi)
//        {
//            object[] attrs = mi.GetCustomAttributes(typeof(CheckNotNullAttribute), true);
//            ParameterInfo[] pis = mi.GetParameters();

//            if (attrs != null && attrs.Length > 0)
//            {
//                foreach (CheckNotNullAttribute attr in attrs)
//                {
//                    int index = FindParameter(pis, attr.ParameterName);

//                    if (index != -1)
//                    {
//                        if (args[index] == null)
//                        {
//                            throw new Exception("DBC Check Failed: NotNull(" + attr.ParameterName + ")");
//                        }
//                    }
//                }
//            }
//        }

//        private int FindParameter(ParameterInfo[] pis,string name)
//        {
//            int index = 0;
//            foreach (ParameterInfo pi in pis)
//            {
//                if (pi.Name == name)
//                {
//                    return index;
//                }

//                index++;
//            }

//            return -1;
//        }
//    }
//}
